/*
 * @Author: xuetao 3168581151@qq.com
 * @Date: 2025-01-28
 * @LastEditors: xuetao 3168581151@qq.com
 * @LastEditTime: 2025-03-16
 * @Description: hive数据库 持久化服务，单例模式
 */

import 'package:path/path.dart' as path;

//hive_repository.dart
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:path_provider/path_provider.dart';
import 'package:hive_flutter/hive_flutter.dart';

import 'package:chat_client/models/user_model.dart'; // 用户
import 'package:chat_client/models/contact_model.dart'; // 联系人
import 'package:chat_client/models/group_model.dart'; // 群聊
import 'package:chat_client/models/conversation_model.dart'; // 会话
import 'package:chat_client/models/apply_model.dart'; // 申请

class HiveService {
  // 私有构造函数
  HiveService._internal();

  // 静态实例，确保只有一个实例
  static final HiveService _instance = HiveService._internal();

  // 公共访问点
  static HiveService get instance => _instance;

  // 初始化 Hive
  static Future<void> initHive() async {
    if (kIsWeb) {
      await Hive.initFlutter();
    } else {
      // 文档目录（Documents directory）：用于存储用户生成的文件或其他需要持久化的数据，通常这些数据在应用关闭或重启后仍然存在
      final appDocumentDir = await getApplicationDocumentsDirectory();
      final hivePath = path.join(appDocumentDir.path, 'hive_db'); // 子目录路径
      await Hive.initFlutter(hivePath);
    }

    /// 注册适配器
    // 用户信息配器
    Hive.registerAdapter(UserAdapter());
    // 联系人配器
    Hive.registerAdapter(ContactAdapter());
    // 群聊适配器
    Hive.registerAdapter(GroupAdapter());
    // 群成员信息适配器
    Hive.registerAdapter(MemberAdapter());
    // 会话适配器
    Hive.registerAdapter(ConversationAdapter());
    // 聊天记里适配器
    Hive.registerAdapter(MessageAdapter());
    // 申请适配器
    Hive.registerAdapter(ApplyAdapter());
  }

  // 打开或创建盒子
  Future<Box<T>> openBox<T>(String boxName) async {
    switch (boxName) {
      // 认证信息和用户信息存在同一个盒子
      case 'self':
        return await Hive.openBox<T>('self');
      case 'contact':
        return await Hive.openBox<T>('contact');
      case 'group':
        return await Hive.openBox<T>('group');
      case 'groupMember':
        return await Hive.openBox<T>('groupMember');
      case 'apply':
        return await Hive.openBox<T>('apply');
      case 'conversation':
        return await Hive.openBox<T>('conversation');
      case 'message':
        return await Hive.openBox<T>('message');
      default:
        throw Exception('Box not found: $boxName');
    }
  }

  Future<void> resetAll({bool forceClose = false}) async {
    try {
      // 分别处理每个Box，确保类型正确
      // await _resetBox<Contact>('self', forceClose);
      await _resetBox<Contact>('contact', forceClose);
      await _resetBox<Group>('group', forceClose);
      await _resetBox<Member>('groupMember', forceClose);
      await _resetBox<Apply>('apply', forceClose);
      await _resetBox<Conversation>('conversation', forceClose);
      await _resetBox<Message>('message', forceClose);
    } catch (e) {
      throw HiveError('清除数据失败: ${e.toString()}');
    }
  }

  // 辅助方法：处理单个Box
  Future<void> _resetBox<T>(String boxName, bool forceClose) async {
    if (Hive.isBoxOpen(boxName)) {
      final box = Hive.box<T>(boxName);
      await box.clear();
      if (forceClose) await box.close();
    } else {
      final box = await Hive.openBox<T>(boxName);
      await box.clear();
      await box.close();
    }
  }
}
